﻿using DBO_ShopMob;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WS_Manager_ShopMob.Helper;

namespace WS_Manager_ShopMob.Model
{
    /// <summary>
    /// Déleguée traitant le resultat d'une requête faite à la source de données
    /// </summary>
    /// <param name="result">Resultat sous format string d'une requete à la source de données</param>
    /// <param name="exception">null sauf s'il y a une erreur lors de la requete à la source de données</param>
    public delegate void ResultHandler(string result, Exception exception);

    /// <summary>
    /// Interface representant les différentes requête qui peuvent être envoyée à la source de données
    /// </summary>
    interface IRepository
    {
        /// <summary>
        /// Méthode permetant d'identifier un utilisateur via son login/mot de passe
        /// </summary>
        /// <param name="login">identifiant de l'utilisateur</param>
        /// <param name="motdePasse">mot de passe de l'utilisateur</param>
        /// <param name="methodToExec">méthode à executer pour traiter le resultat de la requête</param>
        /// <remarks>Pour une sécurité efficace, il faudrait cripter le mot de passe</remarks>
        void Connexion(string login, string motdePasse, ResultHandler methodToExec);
              
        /// <summary>
        /// Méthode permettant d'obtenir les informations du client via son identifiant
        /// </summary>
        /// <param name="login">identifiant de l'utilisateur</param>
        /// <param name="methodToExec">méthode à executer pour traiter le resultat de la requête</param>
        void GetClientParID(string login, ResultHandler methodToExec);
 
        /// <summary>
        /// 
        /// </summary>
        /// <param name="id">id de l'article</param>
        /// <param name="methodToExec"></param>
        void GetMagasinForArticle(long id, ResultHandler methodToExec);

        /// <summary>
        /// Méthode permettant d'obtenir le détail d'une commande
        /// </summary>
        /// <param name="id">id de la commande</param>
        /// <param name="methodToExec"></param>
        void GetCommandeParId(string id, ResultHandler methodToExec);

        /// <summary>
        /// Méthode permettant d'obtenir la liste des commandes en attente
        /// </summary>
        /// <param name="methodToExec"></param>
        void GetCommandesEnAttente(ResultHandler methodToExec);

        /// <summary>
        /// Méthode permettant d'obtenir la liste des commandes en cours
        /// </summary>
        /// <param name="methodToExec"></param>
        void GetCommandesEnCours(ResultHandler methodToExec);

        /// <summary>
        /// Méthode permettant d'obtenir la liste des commandes terminées
        /// </summary>
        /// <param name="methodToExec"></param>
        void GetCommandesTermine(ResultHandler methodToExec);

        /// <summary>
        /// Méthode permettant d'obtenir la liste des commandes d'un livreur
        /// </summary>
        /// <param name="id">id du livreur</param>
        /// <param name="methodToExec"></param>
        void GetCommandesParLivreur(long id, ResultHandler methodToExec);

        /// <summary>
        /// Méthode permettant d'obtenir le détail d'une commande
        /// </summary>
        /// <param name="methodToExec"></param>
        void GetLivreurs(ResultHandler methodToExec);

        /// <summary>
        /// Méthode permettant d'obtenir le détail d'un livreur
        /// </summary>
        /// <param name="id">id du livreur</param>
        /// <param name="methodToExec"></param>
        void GetLivreurs(long id, ResultHandler methodToExec);

    }
}
